test

6.3 处理连接问题

如果无法自动发现本地的JRockit JVM,可以从以下几方面入手检查:

  • 如果是运行在Windows系统上,检查系统临时目录是否支持文件权限控制(例如NTFS是支持的)。这是必要的,因为本地连接需要依据文件访问权限创建所需临时文件,而在FAT这类文件系统上,是无法进行的。
  • 连接目标是否运行在JRockit JVM上?JRockit Mission Control客户端是否运行在JRockit JVM上?
  • 链接目标和JRockit Mission Control客户端使用的是否都是JDK 1.5之上的版本?
  • 是否有权限连接目标JVM?

若目标JVM使用的是JDK 1.4版本,则需要在JRockit Mission Control的JVM浏览器视图中手动新建一个连接,然后在目标JRockit JVM上显式开启管理代理。这是因为在JDK 1.4版本中还没有出现MBean服务器的概念,而JRockit 1.4版本中实现了一个私有的管理协议,称为RMP,在客户端会被转换为JMX。要想启动代理,可以通过添加命令行参数,或使用JRCMD工具实现(参见第11章的介绍)。

如果无法连接到外部的管理代理(例如运行在远程机器上的管理代理),可以从以下几方面入手检查:

  • 连接配置是否正确?在连接面板中有一个按钮可用于测试相关选项是否配置正确。如果目标JVM使用的JDK 1.4,则应该使用3.x版本的客户端来连接。
  • 客户端版本是否正确?最简单的办法是,使用和目标JVM相同的版本。如果目标JVM使用的JDK 1.4,则应该适应3.x版本的客户端。
  • 在连接面板中,JDK版本是否选择正确?
  • 防火墙是否配置正确?
  • 如果启用了SSL的话,客户端和服务器端的SSL配置是否正确?
  • 如果启用了身份验证的话,jmxremote.access文件是否配置正确?
  • 检查目标机器的hosts文件是否配置正确

在处理远程管理代理的连接问题时,首先确保开启了SSL,并关闭了身份校验,如果这时可以正常连接,则按照6.2.7节中介绍的内容检查一下校验信息是否配置正确。

如果管理控制台提示说找不到某个MBean,例如Profiling MBean,很可能是由于jmxremote.access文件配置错误导致的。为了初始化JMXMAPI,用户必须具有创建JRockitConsole这个MBean的权限,从而正确初始化JMXMAPI,参见6.2.7节的介绍。

6.3.1 主机名解析失败的问题

有时候,无法连接到远程JVM可能是因为解析主机名时发生了错误,这时系统给出的错误信息可能是下面这个样子:

Could not open Management Console for sthx6454:7094.
    java.rmi.ConnectException: Connection refused to host:
        127.0.0.1; nested exception is: java.net.ConnectException: Connection refused: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:94)
    at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source)
    at javax.management.remote.rmi.RMIConnector.getConnection(RMIConnector.java:2239)
    at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:271)
    at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:229)
    at com.jrockit.console.rjmx.RJMXConnection.setupServer(RJMXConnection.java:504)

RMI Registry通过暴露出依赖于主机名的存根(stub)来建立于RMI服务器的连接。在之前的示例中,成功的连接到RMI Regstry,接收到连接RMI服务器的存根。创建存根的默认行为是使用InetAddress.getLocalHost().getHostAddress()方法找出所使用的主机名,当主机使用了多个网卡接口或配置错误时,就无法正确解析出主机名了。在之前的示例中,存根中信息指明要连接到localhost,而不是sthx6454

最常见的连接问题是hosts文件(在Linux系统上,是/etc/hosts,在Windows系统上,是%SYSTEMROOT%\system32\drivers\etc\hosts)配置错误,在Linux系统上,可以通过hostname -i命令查看主机名的解析地址。

出了配置hosts文件外,还可以在服务器端设置java.rmi.server.hostname系统属性来指定客户端要练级的主机名。注意,设置改属性会影响到同一台机器上正在运行的其他JVM。

另一个解决办法是使用SSH隧道,该方法只在JRockit R28版本中有效,因为在版本中可以显式指定RMI服务器的端口。